; *************************************************************************
; Copyright (c) 1992 Xerox Corporation.  
; All Rights Reserved.  
;
; Use, reproduction, and preparation of derivative works are permitted.
; Any copy of this software or of any derivative work must include the
; above copyright notice of Xerox Corporation, this paragraph and the
; one after it.  Any distribution of this software or derivative works
; must comply with all applicable United States export control laws.
;
; This software is made available AS IS, and XEROX CORPORATION DISCLAIMS
; ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
; PURPOSE, AND NOTWITHSTANDING ANY OTHER PROVISION CONTAINED HEREIN, ANY
; LIABILITY FOR DAMAGES RESULTING FROM THE SOFTWARE OR ITS USE IS
; EXPRESSLY DISCLAIMED, WHETHER ARISING IN CONTRACT, TORT (INCLUDING
; NEGLIGENCE) OR STRICT LIABILITY, EVEN IF XEROX CORPORATION IS ADVISED
; OF THE POSSIBILITY OF SUCH DAMAGES.
; *************************************************************************
;
; port to R6RS -- 2007 Christian Sloma
; 

(library (clos std-protocols allocate-instance)
  
  (export class-allocate-instance
          entity-class-allocate-instance)
  
  (import (only (rnrs) define let* let if null? begin car cdr + quote)
          (clos private allocation)
          (clos slot-access))
  
  (define (class-allocate-instance class)
    (shared-allocate-instance class 
                              really-allocate-instance))
  
  (define (entity-class-allocate-instance entity-class)
    (shared-allocate-instance entity-class 
                              really-allocate-entity-instance))
  
  (define (shared-allocate-instance class really-allocate)
    (let* ((field-count (slot-ref class 'number-of-fields))
           (field-inits (slot-ref class 'field-initializers))
           (new-object  (really-allocate class field-count)))
      (let loop ((inits field-inits)
                 (index 0))
        (if (null? inits)
            new-object
            (begin
              (instance-set! new-object index ((car inits)))
              (loop (cdr inits)
                    (+ index 1)))))))
  
  ) ;; library (clos std-protocols allocate-instance)
